SnowflakeのMasking Policyを共通データベース・スキーマで作成して適用できるか確認してみた

SnowflakeのMasking Policyを共通データベース・スキーマで作成して適用できるか確認してみた

Clock Icon2024.08.05

さがらです。

小ネタ寄りですが、SnowflakeのMasking Policyを共通データベース・スキーマで作成して適用できるかを確認してみたので、内容をまとめてみます。

結論

SnowflakeのMasking Policyを共通データベース・スキーマで作成して、実際にクエリ対象となる別のデータベース・スキーマのテーブルにMasking Policyを適用することはできます!

また、Masking Policyの条件文に入れているロールに対して、Masking Policyを管理している共通データベース・スキーマに対するUSAGE権限も不要です!

試してみた

下記のcustomersテーブルのfirst_nameカラムに対して、別の共通データベース・スキーマで作成したMasking Policyを適用することを考えてみます。

2024-08-05_11h11_33.png

まず、下記のクエリを実行して、Masking Policyを保存する共通のデータベース・スキーマを作成します。

use role sysadmin;
create database sagara_common_objects_db;
grant ownership on database sagara_common_objects_db to role sagara_admin_role;

use role sagara_admin_role;
use database sagara_common_objects_db;
create schema sagara_common_objects_db.masking_policies;

Masking Policyを適用するために必要な権限を付与します

use role accountadmin;
use database sagara_common_objects_db;
grant create masking policy on schema masking_policies to role sagara_admin_role; -- 本検証では元々スキーマのownershipがあるためなくてもよいが参考として
grant apply masking policy on account to role sagara_admin_role;

共通のデータベース・スキーマにMasking Policyを作成し、対象テーブルのカラムに適用します。

use role sagara_admin_role;
use database sagara_common_objects_db;
use schema masking_policies;
create or replace masking policy first_name_mask as (val string) returns string ->
  case
    when current_role() in ('SAGARA_ADMIN_ROLE') then val
    else '*********'
  end;

use database sagara_rawdata_db;
use schema jaffle_shop;
alter table if exists customers modify column first_name set masking policy sagara_common_objects_db.masking_policies.first_name_mask;

この状態で、Masking Policyの条件に合致しないsagara_dev_roleからクエリを発行してみます。

すると、マスキングが適用されていました!

use role sagara_dev_role;
select * from customers;

2024-08-05_11h22_15.png

下図のように、sagara_dev_roleにはMasking Policyを保存している共通データベースとスキーマに対してUSAGEも付与されていませんが、問題なくマスキングできました。

2024-08-05_11h23_22.png

2024-08-05_11h23_02.png

2024-08-05_11h24_19.png

最後に

SnowflakeのMasking Policyを共通データベース・スキーマで作成して、実際にクエリ対象となる別のデータベース・スキーマのテーブルにMasking Policyを適用できることを確認してみました。その際にクエリを発行するロールに共通データベース・スキーマに対するUSAGE権限も不要であることも確認できました。

特にUSAGEが必要かどうかが気になっていたのですが、不要であることがわかって安心しました!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.